

<!DOCTYPE html>
<html lang="zh" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/walker_sue/img/favicon.png">
  <link rel="icon" type="image/png" href="/walker_sue/img/favicon.png">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="">
  <meta name="author" content="lk">
  <meta name="keywords" content="">
  <title>NLP阅读理解Week1 学习笔记 - Walker_Sue</title>

  <link  rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/walker_sue/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.0/styles/github-gist.min.css" />
    
  

  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/walker_sue/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script  src="/walker_sue/js/utils.js" ></script>
  <script  src="/walker_sue/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.3.0"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/walker_sue/">&nbsp;<strong>Walker</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/">
                <i class="iconfont icon-home-fill"></i>
                主页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <i class="iconfont icon-books"></i>
                文档
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="https://hexo.fluid-dev.com/">
                    
                    主题博客
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="https://hexo.fluid-dev.com/docs/guide/">
                    
                    配置指南
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="https://hexo.fluid-dev.com/docs/icon/">
                    
                    图标用法
                  </a>
                
              </div>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" href="javascript:">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner intro-2" id="background" parallax=true
         style="background: url('/walker_sue/img/default.png') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="container page-header text-center fade-in-up">
    <span class="h2" id="subtitle">
    
</span>




<div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2020-11-05 09:49" pubdate>
        November 5, 2020 am
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      9k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      97
       分钟
    </span>
  

  
  
</div>


</div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="container nopadding-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto" id="post">
            <!-- SEO header -->
            <h1 style="display: none">NLP阅读理解Week1 学习笔记</h1>
            
            <div class="markdown-body" id="post-body">
              <div align='center' ><font size='10'>机器阅读理解</font></div>

<hr>
<div align='center' ><font size='5'>Week 01</font></div>
<div align='center' ><font size='5'>课程介绍与基础概念解析</font></div>

<hr>
<h1 id="课程结构"><a href="#课程结构" class="headerlink" title="课程结构"></a>课程结构</h1><ul>
<li>课程介绍与基础概率解析</li>
<li>常见的机器阅读理解模型（一）</li>
<li>常见的机器阅读理解模型（二）</li>
<li>BERT与机器阅读理解</li>
<li>其他预训练语言模型与阅读理解</li>
<li>基于预训练模型与其他策略扩展的阅读理解模型</li>
<li>模型集成、优化及部署</li>
<li>课程总结与NLP面试指导</li>
</ul>
<h1 id="NLP简介"><a href="#NLP简介" class="headerlink" title="NLP简介"></a>NLP简介</h1><h2 id="定义介绍"><a href="#定义介绍" class="headerlink" title="定义介绍"></a>定义介绍</h2><p>自然语言处理，英文Natural Language Processing，简写NLP。NLP这个概念本身过于庞大，可以把它分成“自然语言”和“处理”两部分。先来看自然语言。区分于计算机语言，自然语言是人类发展过程中形成的一种信息交流的方式，包括口语及书面语，反映了人类的思维，都是以自然语言的形式表达。“处理”是指计算机处理。</p>
<p>NLP 的一个基本问题是：给定一串字幕，确定下一个最大可能性出现的字母是什么？</p>
<p>语言模型就是用于评估文本符合语言使用习惯程度的模型。</p>
<p>如果每个单词 $w_i$ 都要依赖于从第一个单词 $w_1$ 到它之前一个单词 $w_{i-1}$ 的影响，则：
<br>$$p(w_1w_2…w_n)=p(w_1)p(w_2|w_1)p(w_3|w_2w_1)…p(w_n|w_{n-1}…w_2w_1)$$<br>则参数空间过大，不容易计算，并且数据稀疏严重，单词同时出现的概率可能为0，这会导致最终的结果为0.</p>

<blockquote>
<p>n-gram（n 元文法）语言模型是一种基于统计语言的模型，是一个基于概率的判别模型，它的输入是一句话（单词的顺序序列），输出是这句话的概率，即这些单词的联合概率。常用的有 Bi-gram（n=2）和 Tri-gram（n=3）。</p>
</blockquote>
<blockquote>
<p>n-gram 就是把每 n 个单词看作一个字节片段，该模型基于马尔科夫假设：假设在一段文本中，第 n 个词的出现只于它前面 n-1 个词相关。这个假设大大简化了计算过程。</p>
</blockquote>
<blockquote>
<p>n-gram 语言模型的评价方法：困惑度/混乱度（perplexity），其基本思想是给测试集赋予较高概率值的语言模型较好</p>
</blockquote>
<h2 id="基本分类"><a href="#基本分类" class="headerlink" title="基本分类"></a>基本分类</h2><blockquote>
<p>NLP里细分领域和技术实在太多，根据NLP的终极目标，大致可以分为自然语言理解（NLU）和自然语言生成（NLG）两种。</p>
</blockquote>
<blockquote>
<p>NLU侧重于如何理解文本，包括文本分类、命名实体识别、指代消歧、句法分析、机器阅读理解等。</p>
</blockquote>
<blockquote>
<p>NLG则侧重于理解文本后如何生成自然文本，包括自动摘要、机器翻译、问答系统、对话机器人等。两者间不存在有明显的界限，如机器阅读理解实际属于问答系统的一个子领域。</p>
</blockquote>
<h3 id="文本检索"><a href="#文本检索" class="headerlink" title="文本检索"></a>文本检索</h3><blockquote>
<p>多用于大规模数据的检索，典型的应用有搜索引擎。</p>
</blockquote>
<h3 id="机器翻译"><a href="#机器翻译" class="headerlink" title="机器翻译"></a>机器翻译</h3><blockquote>
<p>跨语种翻译，该领域目前已较为成熟。目前谷歌翻译已用上机翻技术。</p>
</blockquote>
<h3 id="文本分类-情感分析"><a href="#文本分类-情感分析" class="headerlink" title="文本分类/情感分析"></a>文本分类/情感分析</h3><blockquote>
<p>本质上就是个分类问题。目前也较为成熟，难点在于多标签分类（即一个文本对应多个标签，把这些标签全部找到）以及细粒度分类（二极情感分类精度很高，即好中差三类，而五级情感分类精度仍然较低，即好、较好、中、较差、差）</p>
</blockquote>
<h3 id="信息抽取"><a href="#信息抽取" class="headerlink" title="信息抽取"></a>信息抽取</h3><blockquote>
<p>从不规则文本中抽取想要的信息，包括命名实体识别、关系抽取、事件抽取等。应用极广。</p>
</blockquote>
<h3 id="序列标注"><a href="#序列标注" class="headerlink" title="序列标注"></a>序列标注</h3><blockquote>
<p>给文本中的每一个字/词打上相应的标签。是大多数NLP底层技术的核心，如分词、词性标注、关键词抽取、命名实体识别、语义角色标注等等。曾是HMM、CRF的天下，近年来逐步稳定为BiLSTM-CRF体系。</p>
</blockquote>
<h3 id="文本摘要"><a href="#文本摘要" class="headerlink" title="文本摘要"></a>文本摘要</h3><blockquote>
<p>从给定的文本中，聚焦到最核心的部分，自动生成摘要。</p>
</blockquote>
<h3 id="问答系统"><a href="#问答系统" class="headerlink" title="问答系统"></a>问答系统</h3><blockquote>
<p>接受用户以自然语言表达的问题，并返回以自然语言表达的回答。常见形式为检索式、抽取式和生成式三种。近年来交互式也逐渐受到关注。典型应用有智能客服</p>
</blockquote>
<h3 id="对话系统"><a href="#对话系统" class="headerlink" title="对话系统"></a>对话系统</h3><blockquote>
<p>与问答系统有许多相通之处，区别在于问答系统旨在直接给出精准回答，回答是否口语化不在主要考虑范围内；而对话系统旨在以口语化的自然语言对话的方式解决用户问题。对话系统目前分闲聊式和任务导向型。前者主要应用有siri、小冰等；后者主要应用有车载聊天机器人。（对话系统和问答系统应该是最接近NLP终极目标的领域）</p>
</blockquote>
<h3 id="知识图谱"><a href="#知识图谱" class="headerlink" title="知识图谱"></a>知识图谱</h3><blockquote>
<p>从规则或不规则的文本中提取结构化的信息，并以可视化的形式将实体间以何种方式联系表现出来。图谱本身不具有应用意义，建立在图谱基础上的知识检索、知识推理、知识发现才是知识图谱的研究方向。</p>
</blockquote>
<h3 id="文本聚类"><a href="#文本聚类" class="headerlink" title="文本聚类"></a>文本聚类</h3><blockquote>
<p>一个古老的领域，但现在仍未研究透彻。从大规模文本数据中自动发现规律。核心在于如何表示文本以及如何度量文本之间的距离。</p>
</blockquote>
<h2 id="基本技术"><a href="#基本技术" class="headerlink" title="基本技术"></a>基本技术</h2><ul>
<li><blockquote>
<p>分词：基本算是所有NLP任务中最底层的技术。不论解决什么问题，分词永远是第一步。</p>
</blockquote>
</li>
<li><blockquote>
<p>词性标注：判断文本中的词的词性（名词、动词、形容词等等），一般作为额外特征使用。</p>
</blockquote>
</li>
<li><blockquote>
<p>句法分析：分为句法结构分析和依存句法分析两种。</p>
</blockquote>
</li>
<li><blockquote>
<p>词干提取：从单词各种前缀后缀变化、时态变化等变化中还原词干，常见于英文文本处理。</p>
</blockquote>
</li>
<li><blockquote>
<p>命名实体识别：识别并抽取文本中的实体，一般采用BIO形式。</p>
</blockquote>
</li>
<li><blockquote>
<p>指代消歧：文本中的代词，如“他”“这个”等，还原成其所指实体。</p>
</blockquote>
</li>
<li><blockquote>
<p>关键词抽取：提取文本中的关键词，用以表征文本或下游应用。</p>
</blockquote>
</li>
<li><blockquote>
<p>词向量与词嵌入：把单词映射到低维空间中，并保持单词间相互关系不变。是NLP深度学习技术的基础。</p>
</blockquote>
</li>
<li><blockquote>
<p>文本生成：给定特定的文本输入，生成所需要的文本，主要应用于文本摘要、对话系统、机器翻译、问答系统等领域。</p>
</blockquote>
</li>
</ul>
<h1 id="机器阅读理解MRC"><a href="#机器阅读理解MRC" class="headerlink" title="机器阅读理解MRC"></a>机器阅读理解MRC</h1><h2 id="机器阅读理解的常见任务"><a href="#机器阅读理解的常见任务" class="headerlink" title="机器阅读理解的常见任务"></a>机器阅读理解的常见任务</h2><p> （1）完形填空</p>
<blockquote>
<p>任务定义：将文章中的某些单词隐去，让模型根据上下文判断被隐去的单词最可能是哪个。</p>
</blockquote>
<p>（2）多项选择</p>
<blockquote>
<p>任务定义：给定一篇文章和一个问题，让模型从多个备选答案中选择一个最有可能是正确答案的选项。</p>
</blockquote>
<p>（3）片段抽取</p>
<blockquote>
<p>任务定义：给定一篇文章和一个问题，让模型从文章中抽取连续的单词序列，并使得该序列尽可能的作为该问题的答案。</p>
</blockquote>
<p>（4）自由作答</p>
<blockquote>
<p>任务定义：给定一篇文章和一个问题，让模型生成一个单词序列，并使得该序列尽可能的作为该问题的答案。与片段抽取任务不同的是，该序列不再限制于是文章中的句子。</p>
</blockquote>
<p><img src="task.jpg" srcset="/walker_sue/img/loading.gif"></p>
<h2 id="经典机器阅读理解的基本框架"><a href="#经典机器阅读理解的基本框架" class="headerlink" title="经典机器阅读理解的基本框架"></a>经典机器阅读理解的基本框架</h2><p>主要包括嵌入编码（Embedding）、特征抽取（Feature Extraction、Encode）、文章-问题交互（Context-Question Interaction）和答案预测（Answer Prediction）四个模块。<br><img src="model.jpg" srcset="/walker_sue/img/loading.gif"><br>（1）嵌入编码</p>
<blockquote>
<p>将自然语言形式的文章和问题转化为固定维度的向量，以便让机器进行处理。常见的编码方式有 one-hot 表示、分布式词向量以及最近的 ELMo、GPT 和 Bert等。</p>
</blockquote>
<p>（2）特征提取</p>
<blockquote>
<p>提取上下文信息，这一模块中常用的神经网络模型有：RNN、CNN和基于多头自注意力机制的Transformer结构。</p>
</blockquote>
<p>（3）文章-问题交互</p>
<blockquote>
<p>利用文章和问题之间的交互信息来推测出文章中那些部分对于回答问题更为重要。该模块通常采用单向或双向的注意力机制来强调原文中与问题更为相关的部分。同时为了更深层次的挖掘文章和问题之间的关系，两者之间的交互可能会重复多次。</p>
</blockquote>
<p>（4）答案预测</p>
<blockquote>
<p>该模块基于上述三个模块累积得到的信息进行最终的答案预测。该模块是高度任务相关的。对于完形填空任务，答案输出是原文中的一个词或实体，一种做法是将文中相同词的注意力权重得分进行累加，最终选择得分最高的词作为答案 [23]；对于多项选择任务，是从多个候选答案中挑选出正确答案,一般是对备选答案进行打分，选择得分最高的候选者作为答案；对于片段抽取任务，从原文中抽取一个连续的子片段作为答案，常用方法是 （Wang S, Jiang J. Machine comprehension using match-lstm and answer pointer[J].arXiv preprint arXiv:1608.07905, 2016.） 提出的预测答案开始和结束位置的概率的边界模型；对于自由作答任务，答案灵活度最高，不再限制于原文中，可能需要进行推理归纳，现有的方法常用抽取和生成相结合的模式。</p>
</blockquote>
<h2 id="机器阅读理解的发展历程"><a href="#机器阅读理解的发展历程" class="headerlink" title="机器阅读理解的发展历程"></a>机器阅读理解的发展历程</h2><p><img src="time.png" srcset="/walker_sue/img/loading.gif"></p>
<h2 id="词法分析"><a href="#词法分析" class="headerlink" title="词法分析"></a>词法分析</h2><p>词法分析任务：将句子转换为词序列并标记句子中的词的词性。</p>
<p>英文词法分析（曲折语）：1. 英文单词识别、词形还原 2. 未登录词处理 3. 英文词性标注</p>
<p>中文词法分析（孤立语）：1. 分词 2. 未登录词识别 3. 词性标注</p>
<p>分词涉及到的问题有：1. 分词标准 2. 切分歧义问题（分词阶段最困难的问题） 3. 未登录词处理</p>
<p>切分歧义可分为交集型歧义和组合型歧义，前者是指字串 abc 既可以分为 ab/c，又可以分为 a/bc。组合型歧义是指 ab 为词，而 a 和 b 在句子中又可以分别单独成词。而以上两种的混合为混合型歧义。</p>
<p>自动分词算法有基于（语言学）规则的方法和基于统计的方法。基于规则的方法需要事先建立好分词词典，经典的算法有最大匹配法（Maximum Matching, MM）。最大匹配算法可分为正向/逆向/双向最大匹配算法。正向最大匹配算法是从左到右将待分词文本中国你的几个连续字符在字典中找其最大匹配的词，并据此进行划分。其优点是程序简单，缺点是会受词典大小的影响。基于统计的方法利用字与字之间、词与词之间的同时出现的频率作为分词的依据。这种方法需要大量标注的语料库。</p>
<p>英文的自动分词工具有 NLTK，中文的自动分词工具有 jieba 和 pkuseg（效果更好）等。</p>
<hr>
<p><strong>TF-IDF 算法</strong></p>
<p>可用该算法提取关键字<br>$$词频(TF)=\frac{某个词在文章中出现的次数}{文章的总词数}$$<br>但是当多个词在同一篇文章中出现的次数一样时，它们的重要性可能是不一样的，当不常见的词出现的次数较多时，则该词就很重要了，所以又引入了以下概念：
<br>$$逆文档频率(IDF)=\log\frac{语料库的文档总数}{包含该词的文档数+1}$$</p>
<p>$$TF-IDF=词频(TF)\times 逆文档频率(IDF)$$</p>
<hr>
<p><strong>PageRank 算法</strong></p>
<p>把互联网看作一个有向图，每个网页看作一个节点，而如果网页 A 中有指向网页 B 的超链接，则在有向图中有一个从节点 A 指向节点 B 的有向边。</p>
<p>网页重要性的计算公式为：<br>$$S(V_i)=(1-d)+d\times \sum_{j\in In(V_i)}\frac{1}{|Out(V_j)|}S(V_j)$$<br>其中 d 是阻尼系数，一般设置为 0.85。$In(V_i)$ 是存在指向网页 i 的链接的网页集合。$Out(V_j)$ 是网页 j 中的链接指向的网页的集合。在初始时，每个网页的重要性 $S(V_i)$ 可以设为 1，利用以上公式经过多次迭代便可以得到最终结果。</p>
<p>该公式表示一个网页的重要性由指向该网页的超链接所在的网页的重要性所决定。</p>
<hr>
<p><strong>TextRank 自动摘要</strong></p>
<p>在 TextRank 所构建的图中，节点就是句子，权重 w 就是两个句子 $S_i$ 和 $S_j$ 的相似程度，两个句子的相似度用以下公式来计算：
 <br>$$Similarity(S_i,S_j)=\frac{(w_k|w_k\in S_i\quad\cap\quad w_k\in S_j)}{\log(|S_i|)+\log(|S_j|)}$$<br>TextRank 公式在 PageRank 公式的基础上，为图中的边引入了权值的概念：
<br>$$WS(V_i)=(1-d)+d\times \sum_{j\in In(V_i)}\frac{w_{ji}}{\sum_{V_k\in Out(V_j)}w_{jk}}WS(V_j)$$<br>其中 $w_{ij}$ 是从节点 $V_i$ 到 $V_j$  的边的权值。<br>算法流程为：将文本进行分词和词性标注处理，去除停用词或词性筛选等之后，设定窗口长度为 K，即最多只能出现 K 个词，进行窗口滑动，在窗口中共同出现的词之间即可建立起无向边。初始化边的权重， 根据公式进行迭代权重，直到收敛。则词的重要性最大的几个词就为提取到的关键词。</p>

<h2 id="句法分析"><a href="#句法分析" class="headerlink" title="句法分析"></a>句法分析</h2><p>句法分析的任务就是确定句子的句法结构或句子中词汇之间的依存关系。</p>
<p>句法分析的分类如下图所示：</p>
<p>完全句法分析是确定句子包含的全部句法信息，并确定句子中各成分之间的关系。局部句法分析只要求识别句子中某些结构相对简单的独立成分。依存句法分析需要分析出词与词之间的依存关系。</p>
<p>依存句法通过分析语言单位内成分之间的依存关系来解释其句法结构，主张句子中核心动词是支配其他成分的中心成分，而它本身却不受其他任何成分的支配，所有受支配成分都以某种关系从属于支配者。需满足 5 个条件：</p>
<p>（1）一个句子中只有一个成分是独立的<br>（2）句子的其他成分都从属于某一成分<br>（3）任何一个成分都不能依存于两个或两个以上的成分<br>（4）如果成分A直接从属成分B，而成分C在句子中位于A和B之间，那么，成分C或者从属于A，或者从属于B，或者从属于A和B之间的某一成分<br>（5）中心成分左右两边的其他成分相互不发生关系</p>
<p>词与词之间直接发生依存关系，构成一个依存对，其中一个是核心词，也称为支配词，另一个叫修饰词，也称为从属词。依存关系用一个有向弧表示，叫做依存弧，其方向可自己定义。</p>

<p>可以使用 spacy 来进行句法分析，其安装语句为<code>pip install spacy</code>，下载英文数据及其对应模型： <code>python -m spacy download en</code></p>
<h2 id="语义分析"><a href="#语义分析" class="headerlink" title="语义分析"></a>语义分析</h2><h3 id="词语语义分析"><a href="#词语语义分析" class="headerlink" title="词语语义分析"></a>词语语义分析</h3><p>词语相似度就是两个词语在不同的上下文中可以相互替代使用而不改变文本的句法语义结构的程度。其取值范围一般为 [0,1]。</p>
<p>当直接计算词语相似度比较困难时，可以先计算词语距离，再转换为词语相似度。词语相似度 $Sim(W_1,W_2)$ 与词语距离 $Dis(W_1,W_2)$ 的关系为：$Sim(W_1,W_2)=\frac{\alpha}{Dis(W_1,W_2)+\alpha}$其中 $\alpha$ 是一个可调节的参数，其含义为：当相似度为 0.5 时的词语距离值。</p>
<p>词语相关性是指两个词语相互关联的程度，可以用两个词语在同一语境中共同出现的可能性来衡量。其取值范围一般为 [0,1]。</p>
<p>词语相似度的计算方法：在由一棵或多棵树形成的同义词词典中，两个概念的语义距离可以表示为对应节点之间的路径长度。除此之外还可以考虑概念层次树的深度（如果两对概念之间的路径长度相等，则处于语义树较低层的语义距离更小）以及概念层次树的区域密度（如果两对概念之间的路径长度相等，则处于较高密度区域的语义距离更大）。</p>

<h3 id="句子语义分析"><a href="#句子语义分析" class="headerlink" title="句子语义分析"></a>句子语义分析</h3><p>知网（hownet）不同于查论文的中国知网，是一个主要面向中文的大型的语言知识库。</p>
<p>句子（语义）相似度的计算可以分为两种方法：基于向量空间模型的方法和对语句进行完全的句法与语义分析。前者将句子看作词的线性序列，用组成句子的词的词频和词性等信息来衡量语句相似度；后者在两个句子进行深层的句法、语义分析的基础上进行相似度的计算。</p>
<hr>
<p>基于语义依存的汉语句子相似度计算：对句子进行依存分析，然后再依存结构的基础上计算句子相似度。</p>
<p>有效搭配对：全句核心词和直接依存于其有效词组成的搭配对，这里有效词定义为动词、名次和形容词。</p>
<p>（1）基于关键词匹配的方法</p>
<p>相似度计算公式：<br>$$Sim(Sen1,Sen2)=\frac{\sum_{i=1}^nW_i}{Max(PairCount1,PairCount2)}$$<br>其中 $\sum_{i=1}^nW_i$ 是句子1和句子2有效搭配对匹配的总权重，PairCount1 是句子1的有效搭配对数。如果两个搭配对 a=b c=d，则匹配权重为1；如果 a=b c!=d 或 a!=b c=d，则匹配权重为 0.5；如果 a!=b c!=d，则匹配权重为 0。</p>
<p>（2）基于语义匹配的方法</p>
<p>利用知网对词做义元分析，即对经过分词和词性标注后的句子进行语义消歧，并在每个词后标注上相应的语义号。匹配权重的计算方法与上述相同。</p>
<p>（3）关键词与语义融合的方法<br>$$S(Sen1,Sen2)=\lambda Sim_{关键词}(Sen1,Sen2)+(1-\lambda)Sim_{语义}(Sen1,Sen2)$$</p>

<h2 id="词向量"><a href="#词向量" class="headerlink" title="词向量"></a>词向量</h2><p>词向量就是用向量的形式来表示自然语言中词的方法，常用的方式有以下几种：</p>
<hr>
<li>One-hot（独热）向量：如果有 n 个词，则把每个词编码为 n 维的 one-hot 向量。但是这种方式存在以下问题：（1）容易受维数灾难的困扰，尤其是将其用于 Deep Learning的一些算法时；（ 2 ）词汇鸿沟，不能很好地刻画词与词之间的相似性；（3）强稀疏性，当维度过度增长的时候,你会发现0特别多,这样造成的后果就是整个向量中有用的信息特别少,几乎就没法做计算。</li>
<li>Distributed Representation（Word Embeding）：通过训练将词表示成固定长度的短向量，相似的词向量之间距离相近。</li>
<hr>
<p><strong>NNLM（神经网络语言）模型</strong></p>
<p>所用到的神经网络主要可分为输入层、投影层、隐藏层和输出层。假设语料库有 10w 个词，投影层有 300 个神经元，滑动窗口为 3 时，滑动窗口会遍历整个语料库，每次向神经网络输入 3 个词。输入的词向量和投影矩阵 C 相乘就把 10w 维的向量转化为了 300 维的向量。投影层再采用全连接的方式与隐藏层连接，并经过 tanh 激活函数激活后进行输出。隐藏层和输出层也是全连接的方式，经过 softmax 函数处理后得到最终的结果。经过多次反向传播更新参数后，投影矩阵 C 的每一列就是对应的每个词的词向量表示。</p>
<hr>
<p><strong>word2vec</strong></p>
<p>word2vec 是用于生成词向量的计算模型，不仅高效，而且还可以获得不同词之间的相似性。Word2Vec是轻量级的神经网络，其模型仅仅包括输入层、隐藏层和输出层，模型框架根据输入输出的不同，主要包括CBOW和Skip-gram模型。 CBOW的方式是在知道词$W_{t-2}$的上下文$W_{t-2},W_{t-1},W_{t+1},W_{t+2}$的情况下预测当前词$W_t$.而Skip-gram是在知道了词$W_t$的情况下,对词$W_t$的上下文$W_{t-2},W_{t-1},W_{t+1},W_{t+2}$进行预测，如下图所示</p>

<p><img src="word2vec.jpg" srcset="/walker_sue/img/loading.gif"></p>
<p><strong>CBOW 模型</strong></p>
<p>输入是某个特征词的上下文相关的词对应的向量，输出是这个特定词的词向量。</p>
<p>无隐藏层，使用双向上下文窗口（由当前词的上下文确定该词），输入层直接使用低维稠密表示，投影层简化为加和取平均。</p>

<blockquote>
<p>Simple CBOW Model</p>
</blockquote>
<p><img src="simple_CBOW.jpg" srcset="/walker_sue/img/loading.gif"></p>
<blockquote>
<p>CBOW Multi-Word Context Model</p>
</blockquote>
<p><img src="multi_CBOW.jpg" srcset="/walker_sue/img/loading.gif"></p>
<p>负例采样：词典中的每一个词对应一条线段，所有词组成了 [0,1] 之间的剖分<br>$$len(w)=\frac{counter(w)}{\sum_{u\in D}counter(u)}$$<br>Skip-gram 模型：输入是特定词的词向量，而输出是该特定词的上下文词向量。无隐藏层，投影层也可以省略，每个词向量作为 log-linear 模型的输入</p>

<p><img src="skip-gram.jpg" srcset="/walker_sue/img/loading.gif"></p>
<p>word2vec 有两种改进方式，一种是基于层次 softmax 的，另一种是基于负例采样（Negative Sampling）的。</p>
<p>negative sampling 本质是预测总体类别的一个子集</p>
<hr>
<p><strong>层次 softmax</strong></p>
<p>在 CBOW 模型或 Skip-gram 模型的输出层会用 softmax 计算所有词向量的概率，这无疑是很浪费时间的。可以用霍夫曼树来代替隐藏层和输出层的神经元，霍夫曼树的叶子节点相当于输出层的神经元，第 i 个叶子节点对应着语料库中的第 i 个词，每个词在语料库中出现的次数作为叶子节点的权重。 而内部节点则起到隐藏层神经元的作用。在霍夫曼树中，隐藏层到输出层的 softmax 映射不是一下子完成的，而是沿着霍夫曼树一步步完成的，因此这种 softmax 取名为”Hierarchical Softmax”。</p>
<p>哈夫曼树的每一次分支可以看作是一次二分类。对于词典 D 中的任意词 w，在哈夫曼树中必然只存在一条从根节点到对应的叶子节点的路径，这条路径上的每一个分支看作是一次二分类，每一次二分类就产生一个概率，将这些概率乘起来就是要求的 $p(w|Context(w))$。</p>
<p>下面以 CBOW 模型为例，说一下神经网络的损失函数、输入、输出及计算流程，尽量不涉及复杂的公式推导。</p>
<p>由于我们要用某个词的上下文信息推导出该词，也就是让条件概率 $p(w|Context(w))$ 最大。其中 w 是所求词，Context(w) 是该词的上下文（也就是前后各 k 个词）。那么损失函数可以设为：<br>$$Loss=\log p(w|Context(w))$$<br>模型的输入是所求词前后各 k 个词对应的词向量，输出是所求词的词向量。与原始的 CBOW 模型不同的是，从输入层到投影层不再是做全连接和激活函数，而是将输入的这 2k 个词向量求和（对应的元素相加）。求和后的词向量直接作为哈夫曼树（输出层）的输入，计算所经过的路径后相应叶子节点的概率值。</p>
<p>使用霍夫曼树有什么好处呢？首先，由于是二叉树，之前计算量为V,现在变成了log2V。第二，由于使用霍夫曼树是高频的词靠近树根，这样高频词需要更少的时间会被找到，这符合我们的贪心优化思想。</p>

<h2 id="经典的机器阅读理解模型"><a href="#经典的机器阅读理解模型" class="headerlink" title="经典的机器阅读理解模型"></a>经典的机器阅读理解模型</h2><p>前面提到过，机器阅读理解模型主要可以分为基于机器学习的、基于注意力机制的，以及基于预训练的。由于基于机器学习的模型效果都比较差，出现的时间也是较早之前了，所以下面只介绍基于注意力机制的几个经典模型—— match-LSTM、BiDAF 和 QA-Net，以及基于预训练的经典模型—— BERT 和 ALBERT。</p>
<h3 id="match-LSTM"><a href="#match-LSTM" class="headerlink" title="match-LSTM"></a>match-LSTM</h3><p>该模型整合了 match-LSTM 和 Pointer-Net 两个模块，前者也是该作者提出的，但是用于文本蕴含任务。后者可以让预测答案中的单词来源于原文，而不是一个固定长度的词汇表。<br>在经典的 match-LSTM 中输入有两个，一个是前提（premise），另一个是假说（hypothesis）。其目的是判断根据前提是否能推断出假说。这里可以将问题看作是前提，把文章看作是假说，这样做相当于带着问题去文章中寻找答案。这解决了原文和问题的匹配问题。<br><br><br><img src="match-LSTM.jpg" srcset="/walker_sue/img/loading.gif"><br><br><br>Pointer-Net 用于从原文中选取答案，这里又提出了两种预测答案的模式：</p>
<ul>
<li>序列模型（Sequence Model）：不做连续性假设，预测答案存在与原文的每一个位置；</li>
<li>边界模型（Boundary Model）：直接预测答案在原文中起始和结束位置。相比于序列模型加快了速度，并且效果更好。因此后来的模型普遍使用边界模型来进行答案范围的预测。</li>
</ul>
<p>以上两个模块都运用了注意力机制，match-LSTM 模块使用注意力机制来计算文章中第 i 个 token 和问题中第 j 个 token 的匹配程度。Pointer-Net 模块使用注意力机制来预测位置。</p>
<h3 id="BiDAF"><a href="#BiDAF" class="headerlink" title="BiDAF"></a>BiDAF</h3><p>BiDAF 是 Bi-Directional Attention Flow（双向注意力流）的缩写。在该模型之前的注意力机制大致有三个特点：</p>
<ul>
<li>如前面提到的 match-LSTM 模型，它们通常都是单向的从问题到文本的注意力权重；</li>
<li>注意力权重通常通过将上下文概括为固定长度的向量，进而从上下文中提取强相关信息用来回答问题；</li>
<li>在文本域中，注意力权重通常在时间上是临时动态的，其中当前时间步的注意权重是前一时间步参与向量的函数。</li>
</ul>
<p>而 BiDAF 的贡献主要有：(1) 采用了双向的注意力机制 (2) 采用了多粒度结合的编码方式<br><br><br><img src="BiDAF.jpg" srcset="/walker_sue/img/loading.gif"><br><br><br>BiDAF 的注意力机制特点如下：</p>
<ul>
<li>计算了 query-to-context ( Q2C ) 和 context-to-query ( C2Q ) 两个方向的注意力信息，认为 C2Q 和 Q2C 实际上能够相互补充。</li>
<li>BiDAF 并不是将文本总结为一个固定长度的向量，而是将向量流动起来，以便减少早期信息加权和的损失；</li>
<li>Memory-less，在每一个时刻，仅仅对问题和当前时刻的上下文进行计算，并不直接依赖上一时刻的注意力，这使得后面的注意力计算不会受到之前错误的注意力信息的影响；</li>
</ul>
<p>多粒度结合的编码方式：网络的前三层分别对字符（character）、单词（word）和上下文（context）进行嵌入编码，也就是具有多层级不同粒度的表征编码器。</p>
<h3 id="QA-Net"><a href="#QA-Net" class="headerlink" title="QA-Net"></a>QA-Net</h3><p>在QA-Net 之前的网络的关键技术主要有 RNN 模型和注意力机制。但是由于 RNN 的存在，所以模型的训练和推断速度都比较慢。QA-Net 就使用了卷积来代替传统的 RNN 结构，并采用了多种技巧（trick），较大的提高了模型的训练和推断速度，并保证了模型的精度。该模型中卷积用来捕获文本的局部信息，注意力用来学习每对单词之间的全局交互。<br><br><br><img src="QA-Net1.png" srcset="/walker_sue/img/loading.gif"><br><br><br>该模型还提出了新型的数据增强（data augment）技术 ，这种技术类似于CV中的数据增强技术。即先将原始句子从英语转化为其他语言，然后再将其转化回英语。这样的优点是可以增加可以使用的数据量。<br><br><br><img src="QA-Net2.png" srcset="/walker_sue/img/loading.gif"><br><br><br>该模型还使用了较多的技巧来减少参数、提升模型的速度，主要有：深度可分离卷积、层正则化、自注意力机制等。</p>
<h3 id="深度可分离卷积"><a href="#深度可分离卷积" class="headerlink" title="深度可分离卷积"></a>深度可分离卷积</h3><p>如果卷积核大小是 3 × 3 3\times 33×3，输入图像的通道数是5，输出图像的通道为10，则普通的卷积会在每个通道上设置一个 3 × 3 3\times 33×3 卷积核，与对应的通道做完卷积后相加得到输出图像中的一个通道。用 10 组 4通道 × ( 3 × 3 ) \times(3\times3)×(3×3) 卷积核重复以上过程，就得到了要求的 10 通道的图像。<br><br><br><img src="xception.jpg" srcset="/walker_sue/img/loading.gif"><br><br><br>如上图所示，而深度可分离卷积将以上过程拆分为了两个子过程，先用 4通道 × ( 3 × 3 ) \times(3\times3)×(3×3) 卷积核在每个通道上做卷积，得到 4 通道的图像，然后用 10 组大小为 1 × 1 1\times 11×1，通道为 4 的卷积核与 4 通道的图像做卷积，得到最终 10 通道的输出图像。<br>这种卷积方式的优点是大大的降低了参数的数量，从而加快了模型的速度。</p>
<h3 id="BERT"><a href="#BERT" class="headerlink" title="BERT"></a>BERT</h3><p>BERT 是 Bidirectional Encoder Representations from Transformers 的缩写，即来自 Transformer 的双向编码器表示，其中 Transformer 是另一种模型结构，BERT 就是在这种模型的基础上提出的。BERT 的最大特点是用遮蔽语言模型来利用上下文信息并使用自监督数据进行训练，并使用“next sentence prediction”任务来捕获句子之间的关系，此外用预训练（pre-train）加微调（fine-tune）的方式增强模型的泛化能力。</p>
<blockquote>
<p>预训练+微调</p>
</blockquote>
<p><img src="bert.jpg" srcset="/walker_sue/img/loading.gif"><br><br></p>
<p>预训练+微调就是先对模型的上层结构进行参数的预训练，然后根据任务的不同改变网络的下层结构，并对上层参数进行微调，这样可以使得模型的泛化能力更强，并且训练所需要的时间也得到了缩减。<br>在将预训练好的语言表达应用到下流任务有两种策略：(1) 基于特征的方法，即在处理不同的任务时，将预训练得到的表达作为附加特征 (2) 微调的方法，只引入少量需要从头开始训练的参数，其他参数只需要在预训练模型的基础上简单微调。</p>
<blockquote>
<p>遮蔽语言模型</p>
</blockquote>
<p>对于字符（token）级的任务来说，以上两种方式都限制了模型充分的结合上下文信息。同时 BERT 的参数非常多，所以需要大量的训练数据，为了解决该问题，BERT 使用了遮蔽语言模型（masked language model, MLM）。这种模型收到了完形填空的启发，它会随机的遮蔽输入中的某些 token，并让模型根据上下文去预测被遮蔽的 token 是什么。这使得表达能够混合上下文信息并且可以充分地利用无监督（自监督）的数据来进行训练。<br>但是 MLM 又带来了两个问题，一是造成了预训练和微调过程的不匹配，因为 [mask] 标志在微调过程中并不存在（预训练过程使用的是mask过的无监督数据，而微调过程使用的是有监督的真实数据），为了解决该问题，并不总是真的用 [mask] 标记来替换被选择的单词，而是在一定概率下不替换或者换成其他随机选取的单词。第二个问题是因为只有部分数据（而不是全部的数据）被标记为 [mask] 并需要预测，所以需要更多的训练时间（需要更多的batch来训练），但是这与所带来的效果相比是值得的。</p>
<blockquote>
<p>预测下一个句子</p>
</blockquote>
<p>另外某些任务是基于对两个句子之间关系的理解的，但是这并不能由语言模型直接捕获。这可以用“预测下一个句子（NSP）”的任务来解决，输入的两个句子 A 和 B，B 有一半的几率是 A 的下一句，另一半的几率是随机的句子。用模型来预测 B 是不是 A 的下一句话，从而让模型能够捕获句子之间的关系。<br>BERT 模型提出后，在11种文本挖掘任务中取得了当时最好的结果，并且对之前的最好的模型有很大的提升，被广泛认为是一个具有里程碑意义的模型。</p>
<h3 id="ALBERT"><a href="#ALBERT" class="headerlink" title="ALBERT"></a>ALBERT</h3><p>ALBERT 是 A Lite BERT 的缩写，是一个轻量级的 BERT 模型，到目前为止（2019.11.8），它在 SQuAD2.0 数据集上达到了最好的效果。其最大的特点是参数少、速度快。<br><br><br><img src="ALBERT.jpg" srcset="/walker_sue/img/loading.gif"><br><br></p>
<p>ALBERT 结合了两种参数约简(parameter reduction)技术：</p>
<blockquote>
<p>第一个技术是对嵌入参数进行因式分解(factorized embedding parameterization)。通过将大的词汇表嵌入矩阵分解为两个小的矩阵，将隐藏层的大小与词汇表嵌入的大小分离开来。这种分离使得在不显著增加词汇表嵌入的参数大小的情况下，更容易增加隐藏层大小。</p>
</blockquote>
<blockquote>
<p>第二种技术是跨层参数共享(cross-layer parameter sharing)。这种技术可以防止参数随着网络深度的增加而增加。</p>
</blockquote>
<p>下图是 BERT 和 ALBERT 模型参数的对比：<br><br><br><img src="ALBERT2.jpg" srcset="/walker_sue/img/loading.gif"><br><br><br>由于 BERT 中基于 NSP 任务的损失效果并不好，所以 ALBERT 还引入了基于预测句子顺序（sentence-order prediction, SOP）的预训练损失，SOP 主要聚焦在句子的句内连贯性。</p>
<h2 id="评测指标"><a href="#评测指标" class="headerlink" title="评测指标"></a>评测指标</h2><blockquote>
<p>准确率和召回率</p>
</blockquote>
<p>$$准确率\quad Precision=\frac{分类正确的文本数}{总的文本数}\times100%$$<br>$$P=\frac{TP}{TP+FP}$$</p>
<p>$$召回率\quad Recall=\frac{分类正确的文本数}{应有的文本数}\times100\%$$</p>
$$R=\frac{TP}{TP+FN}$$

<blockquote>
<p>F1调和平均值</p>
</blockquote>
<p>$$F1=\frac{2\times P\times R}{P+R}$$</p>
<blockquote>
<p>Rouge-L</p>
</blockquote>
<p>$$R_lcs = \frac{(X,Y)}{m},\quad P_lcs = \frac{(X,Y)}{n},\quad F_lcs=\frac{(1+\beta)^2R_lcsP_lcs}{R_lcs+\beta^2P_lcs}$$</p>
<blockquote>
<p>BLEU</p>
</blockquote>
<p>$$P_n(C,R)\quad=\quad\frac{\sum_i\sum_k min(h_k(C_i),max(h_k(r_i)))}{\sum_i\sum_k h_k(C_i)}$$</p>
<h2 id="MRC语料库"><a href="#MRC语料库" class="headerlink" title="MRC语料库"></a>MRC语料库</h2><blockquote>
<p>完形填空：</p>
</blockquote>
<ul>
<li>CNN&amp;Daily Mail</li>
<li>CBT</li>
</ul>
<blockquote>
<p>单项选择：</p>
</blockquote>
<ul>
<li>MC Test</li>
<li>RACE</li>
</ul>
<blockquote>
<p>答案抽取：</p>
</blockquote>
<ul>
<li>SQuAD：Stanford Question Answering Dataset (SQuAD) is a reading comprehension dataset, consisting of questions posed by crowdworkers on a set of Wikipedia articles, where the answer to every question is a segment of text, or span, from the corresponding reading passage, or the question might be unanswerable.<a target="_blank" rel="noopener" href="https://rajpurkar.github.io/SQuAD-explorer/">SQuAD链接</a></li>
<li>NewsQA</li>
</ul>
<blockquote>
<p>自由回答：</p>
</blockquote>
<ul>
<li>MS_MARCO</li>
<li>DuReader :一个大规模、面向真实应用、由人类生成的中文阅读理解数据集。DuReader聚焦于真实世界中的不限定领域的问答任务。<br><a target="_blank" rel="noopener" href="http://ai.baidu.com/broad/download?dataset=dureader">百度源</a>,<br><a target="_blank" rel="noopener" href="https://aistudio.baidu.com/aistudio/competition/detail/28">2020语言与智能技术竞赛</a></li>
</ul>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/walker_sue/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/">机器学习</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/walker_sue/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/">机器学习</a>
                    
                      <a class="hover-with-bg" href="/walker_sue/tags/NLP/">NLP</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">本博客所有文章除特别声明外，均采用 <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" rel="nofollow noopener noopener">CC BY-SA 4.0 协议</a> ，转载请注明出处！</p>
              
              
                <div class="post-prevnext row">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/walker_sue/2020/12/30/BI-week1-ARIMA/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">时间序列分析（一）</span>
                        <span class="visible-mobile">Vorheriger</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;TOC</p>
  <div id="tocbot"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    
  </main>

  
    <a id="scroll-top-button" href="#" role="button">
      <i class="iconfont icon-arrowup" aria-hidden="true"></i>
    </a>
  

  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">Suchen</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">Stichwort</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  

  

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
  </div>
  

  

  
</footer>

<!-- SCRIPTS -->
<script  src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
<script  src="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/js/bootstrap.min.js" ></script>
<script  src="/walker_sue/js/debouncer.js" ></script>
<script  src="/walker_sue/js/main.js" ></script>

<!-- Plugins -->


  
    <script  src="/walker_sue/js/lazyload.js" ></script>
  



  



  <script defer src="https://cdn.staticfile.org/clipboard.js/2.0.6/clipboard.min.js" ></script>
  <script  src="/walker_sue/js/clipboard-use.js" ></script>







  <script  src="https://cdn.staticfile.org/tocbot/4.11.1/tocbot.min.js" ></script>
  <script>
    $(document).ready(function () {
      var boardCtn = $('#board-ctn');
      var boardTop = boardCtn.offset().top;

      tocbot.init({
        tocSelector: '#tocbot',
        contentSelector: '#post-body',
        headingSelector: 'h1,h2,h3,h4,h5,h6',
        linkClass: 'tocbot-link',
        activeLinkClass: 'tocbot-active-link',
        listClass: 'tocbot-list',
        isCollapsedClass: 'tocbot-is-collapsed',
        collapsibleClass: 'tocbot-is-collapsible',
        collapseDepth: 0,
        scrollSmooth: true,
        headingsOffset: -boardTop
      });
      if ($('.toc-list-item').length > 0) {
        $('#toc').css('visibility', 'visible');
      }
    });
  </script>



  <script  src="https://cdn.staticfile.org/typed.js/2.0.11/typed.min.js" ></script>
  <script>
    function typing(id, title){
        var typed = new Typed('#' + id, {
            strings: [
              '  ',
              title + "&nbsp;",
            ],
            cursorChar: "_",
            typeSpeed: 70,
            loop: false,
        });
        typed.stop();
        $(document).ready(function () {
            $(".typed-cursor").addClass("h2");
            typed.start();
        });
    }
    
        typing("subtitle", "NLP阅读理解Week1 学习笔记")
    
  </script>


  <script  src="https://cdn.staticfile.org/anchor-js/4.2.2/anchor.min.js" ></script>
  <script>
    anchors.options = {
      placement: "right",
      visible: "hover",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>



  <script  src="/walker_sue/js/local-search.js" ></script>
  <script>
    var path = "/walker_sue/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      searchFunc(path, 'local-search-input', 'local-search-result');
      this.onclick = null
    }
  </script>



  <script  src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css" />

  <script>
    $('#post img:not(.no-zoom img, img[no-zoom]), img[zoom]').each(
      function () {
        var element = document.createElement('a');
        $(element).attr('data-fancybox', 'images');
        $(element).attr('href', $(this).attr('src'));
        $(this).wrap(element);
      }
    );
  </script>





  

  
    <!-- MathJax -->
    <script>
      MathJax = {
        tex: {
          inlineMath: [['$', '$'], ['\\(', '\\)']]
        },
        options: {
          renderActions: {
            findScript: [10, doc => {
              document.querySelectorAll('script[type^="math/tex"]').forEach(node => {
                const display = !!node.type.match(/; *mode=display/);
                const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
                const text = document.createTextNode('');
                node.parentNode.replaceChild(text, node);
                math.start = { node: text, delim: '', n: 0 };
                math.end = { node: text, delim: '', n: 0 };
                doc.math.push(math);
              });
            }, '', false],
            insertedScript: [200, () => {
              document.querySelectorAll('mjx-container').forEach(node => {
                let target = node.parentNode;
                if (target.nodeName.toLowerCase() === 'li') {
                  target.parentNode.classList.add('has-jax');
                }
              });
            }, '', false]
          }
        }
      };
    </script>

    <script async src="https://cdn.staticfile.org/mathjax/3.0.5/es5/tex-svg.js" ></script>

  











</body>
</html>
